package kr.pe.johnkim.carrotpoint.mobile.service;

import kr.pe.johnkim.carrotpoint.mobile.dao.CarrotPointMemberPointLogDao;
import kr.pe.johnkim.carrotpoint.mobile.dao.CarrotPointPointDao;
import kr.pe.johnkim.carrotpoint.mobile.domain.CarrotPointMemberPointLog;
import kr.pe.johnkim.carrotpoint.mobile.domain.CarrotPointPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Carrot Point 포인트 관련 service 클래스 이다.
 *
 * @author : John_Kim <cale9797@gmail.com>
 * @date : 13. 2. 6.
 */
@Service
public class CarrotPointPointServiceImpl implements CarrotPointPointService {

    // SLF4J Logging
    private Logger logger = LoggerFactory.getLogger(CarrotPointPointServiceImpl.class);

    @Autowired
    private CarrotPointPointDao carrotPointPointDao;

    @Autowired
    private CarrotPointMemberPointLogDao carrotPointMemberPointLogDao;

    /**
     * 가맹점에 해당 사용자가 등록되어 있는지 확인 한다.
     *
     * @param carrotPointPoint
     * @return
     */
    @Override
    public CarrotPointPoint getMemberPointExist(CarrotPointPoint carrotPointPoint) {
        logger.info("getMemberPointExist");
        return carrotPointPointDao.getMemberPointExist(carrotPointPoint);
    }

    /**
     * 가맹점에서 해당 사용자의 포인트 점수(정보)를 가져 온다.
     *
     * @param carrotPointPoint
     * @return
     */
    @Override
    public CarrotPointPoint getMemberPointInformation(CarrotPointPoint carrotPointPoint) {
        logger.info("getMemberPointInformation");
        return carrotPointPointDao.getMemberPointInformation(carrotPointPoint);
    }

    /**
     * 포인트를 등록 한다.
     *
     * 1. 포인트 등록 한다.
     * 2. 포인트 아이디를 가져 온다.
     * 3. 포인트 로그를 등록 한다.
     *
     * @param carrotPointPoint
     */
    @Override
    public void registerPoint(CarrotPointPoint carrotPointPoint) {
        logger.info("registerPoint");

        // 포인트를 등록 한다.
        carrotPointPointDao.registerPoint(carrotPointPoint);

        // 포인트 아이디를 가져 온다.
        String idCarrotPointPoint = carrotPointPointDao.getMemberPointInformation(carrotPointPoint).getIdCarrotPointPoint();

        CarrotPointMemberPointLog parameter = new CarrotPointMemberPointLog();

        parameter.setMemberId(carrotPointPoint.getCarrotPointMemberMemberId());
        parameter.setMerchantId(carrotPointPoint.getCarrotPointMerchantMerchantId());
        parameter.setContent(carrotPointPoint.getContent());
        parameter.setPoint(carrotPointPoint.getPoint());
        parameter.setActivateYn(carrotPointPoint.getActivateYn());
        parameter.setModifyDate(carrotPointPoint.getModifyDate());
        parameter.setRegisterDate(carrotPointPoint.getRegisterDate());
        parameter.setCarrotPointPointIdCarrotPointPoint(idCarrotPointPoint);

        logger.info("memberId                           : {}", parameter.getMemberId());
        logger.info("merchantId                         : {}", parameter.getMerchantId());
        logger.info("content                            : {}", parameter.getContent());
        logger.info("point                              : {}", parameter.getPoint());
        logger.info("activateYn                         : {}", parameter.getActivateYn());
        logger.info("modifyDate                         : {}", parameter.getModifyDate());
        logger.info("registerDate                       : {}", parameter.getRegisterDate());
        logger.info("carrotPointPointIdCarrotPointPoint : {}", parameter.getCarrotPointPointIdCarrotPointPoint());

        // 포인트 로그를 등록 한다.
        carrotPointMemberPointLogDao.registerMemberPointLog(parameter);
    }

    /**
     * 사용자의 포인트 점수를 업데이트 한다.
     *
     * 1. 포인트 아이디를 가져 온다.
     * 2. 포인트 업데이트 한다.
     * 3. 포인트 로그를 등록 한다.
     *
     * @param carrotPointPoint
     */
    @Override
    public void updatePoint(CarrotPointPoint carrotPointPoint) {
        logger.info("updatePoint");

        // 포인트를 가져 온다.
        carrotPointPointDao.updatePoint(carrotPointPoint);

        // 포인트 아이디를 가져 온다.
        String idCarrotPointPoint = carrotPointPointDao.getMemberPointInformation(carrotPointPoint).getIdCarrotPointPoint();

        CarrotPointMemberPointLog parameter = new CarrotPointMemberPointLog();

        parameter.setMemberId(carrotPointPoint.getCarrotPointMemberMemberId());
        parameter.setMerchantId(carrotPointPoint.getCarrotPointMerchantMerchantId());
        parameter.setContent(carrotPointPoint.getContent());
        parameter.setPoint(carrotPointPoint.getPoint());
        parameter.setActivateYn(carrotPointPoint.getActivateYn());
        parameter.setModifyDate(carrotPointPoint.getModifyDate());
        parameter.setRegisterDate(carrotPointPoint.getRegisterDate());
        parameter.setCarrotPointPointIdCarrotPointPoint(idCarrotPointPoint);

        logger.info("memberId                           : {}", parameter.getMemberId());
        logger.info("merchantId                         : {}", parameter.getMerchantId());
        logger.info("content                            : {}", parameter.getContent());
        logger.info("point                              : {}", parameter.getPoint());
        logger.info("activateYn                         : {}", parameter.getActivateYn());
        logger.info("modifyDate                         : {}", parameter.getModifyDate());
        logger.info("registerDate                       : {}", parameter.getRegisterDate());
        logger.info("carrotPointPointIdCarrotPointPoint : {}", parameter.getCarrotPointPointIdCarrotPointPoint());

        // 포인트 로그를 등록 한다.
        carrotPointMemberPointLogDao.registerMemberPointLog(parameter);
    }

    /**
     * 사용자의 포인트 목록을 가져 온다.(사용자의 smart phone 에 출력 한다.)
     *
     * @param carrotPointPoint
     * @return
     */
    @Override
    public List<CarrotPointPoint> getMemberMerchantPointList(CarrotPointPoint carrotPointPoint) {
        logger.info("getMemberMerchantPointList");
        return carrotPointPointDao.getMemberMerchantPointList(carrotPointPoint);
    }

    /**
     * 가맹점에 등록된 사용자의 포인트 목록을 가져 온다.(가맹점 tablet PC/iPad 에 출력 한다.)
     *
     * @param carrotPointPoint
     * @return
     */
    @Override
    public List<CarrotPointPoint> getMerchantMemberPointList(CarrotPointPoint carrotPointPoint) {
        logger.info("getMerchantMemberPointList");
        return carrotPointPointDao.getMerchantMemberPointList(carrotPointPoint);
    }

    /**
     * 포인트를 비활성화 한다.
     *
     * @param carrotPointPoint
     */
    @Override
    public void updateDeactivatePoint(CarrotPointPoint carrotPointPoint) {
        logger.info("updateDeactivatePoint");
        carrotPointPointDao.updateDeactivatePoint(carrotPointPoint);
    }
}
